/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package utils;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import lk.Ruta;
import lk.Vuelo;

/**
 *
 * @author Xtian
 */
public class impresiones {
    
       
    public static void imprimirRutaGrasp(Ruta ruta) throws IOException{
        FileWriter fw = new FileWriter( "output_debugging/rutaGrasp.out") ;
        PrintWriter pw = new PrintWriter( fw ) ;
        
        pw.println("VUELOS GENERADOS POR GRASP");
        pw.println();
        pw.println("Origen\t\t\t\t\t\tDestino");
        pw.print("Ciudad(Contienente)\t/Fecha-Hora");
        pw.println("\t\t\tDestino(Continente)/Fecha-Hora");
        pw.println("--------------------------------------");
        
        Vuelo vuelo;
        for (int i = 0; i<ruta.vuelos.size();i++){
            vuelo = ruta.vuelos.get(i);
            //Origen
            pw.print(vuelo.origen.pais.nombrePais+"("+vuelo.origen.pais.continente+")");
            pw.print("\t"+vuelo.fechaSalida.dia+"/"+vuelo.fechaSalida.mes+"/"+vuelo.fechaSalida.anho+"-"+vuelo.fechaSalida.hora);
            //Destino
            pw.print("\t\t"+vuelo.destino.pais.nombrePais+"("+vuelo.destino.pais.continente+")");
            pw.println("\t"+vuelo.fechaLlegada.dia+"/"+vuelo.fechaLlegada.mes+"/"+vuelo.fechaLlegada.anho+"-"+vuelo.fechaLlegada.hora);
        }
        
        pw.close();
    }
    
    public static void debugTramoX(Ruta ruta, int opt, int indice, ArrayList<Vuelo> tramoX){
        System.out.println("DEBUGGIN TRAMO X");
        
        System.out.print("Ruta: ");
        for (int i=0; i<ruta.vuelos.size();i++){
            System.out.print(ruta.vuelos.get(i).idVuelo+"-");
        }
        System.out.println();
        System.out.println("Opt = "+opt);
        System.out.println("Indice = "+indice);
        
        System.out.print("TramoX: ");
        for (int i=0; i<tramoX.size();i++){
            System.out.print(tramoX.get(i).idVuelo+"-");
        }
        System.out.println();
    }
    
    public static void ubicarVuelosLimites(Vuelo vueloOrigen,Vuelo vueloDestino,ArrayList<Vuelo> tramoX, int opt, Ruta ruta){
        
        int indice=0;
        Vuelo vueloActual=null;
        for(int i = 0; i<ruta.vuelos.size();i++){
            //Si tramoX no se encuentra 
            //if ((i+opt-1){
                
            //}
            vueloActual = ruta.vuelos.get(i);
            if (vueloActual.idVuelo == tramoX.get(0).idVuelo) {
                try{
                    //Estas asumiendo que tramoX está 100% bien formado (cuando en realidad está tomando menos que los opts)
                    if (ruta.vuelos.get(i+opt-1).idVuelo==tramoX.get(tramoX.size()-1).idVuelo){
                        indice=i;
                        break;
                    }
                }catch(IndexOutOfBoundsException e){
                    System.out.println();
                    System.out.println();
                    System.out.println(ruta.vuelos.size()+"//"+(i+opt-1));
                    System.exit(-1);
                }
            }
        }
        
        //Devolver null cuando no hay antes y cuando no hay despues
        //Otro caso es cuando sí hay ;)
        vueloOrigen=null;
        if (indice>0){
            vueloOrigen=ruta.vuelos.get(indice-1);
        }
        
        vueloDestino=null;
        if((indice+opt-1) < ruta.vuelos.size()-1){
            vueloDestino=ruta.vuelos.get(indice+opt);
        }
        
    }
    
    public static void debugTramosY(ArrayList<ArrayList<Vuelo>> tramosY, ArrayList<Vuelo> tramoX,Ruta ruta,int opt) throws IOException{
        FileWriter fw = new FileWriter( "output_debugging/tramosY.out") ;
        PrintWriter pw = new PrintWriter( fw ) ;
        
        pw.println("DEBUGGIN TRAMOS Y");
        
        pw.println("Fecha límite de los tramos");
        pw.print("Fecha llegada");
        pw.println("\t\tFecha salida");
        pw.println("-------------------------------");
        Vuelo vueloAntesOrigen=null, vueloDespuesDestino=null;
        ubicarVuelosLimites(vueloAntesOrigen,vueloDespuesDestino,tramoX,opt,ruta);
        if (vueloAntesOrigen!=null){
            pw.print(vueloAntesOrigen.origen.pais.nombrePais+"/"+vueloAntesOrigen.fechaSalida.dia+"/"+vueloAntesOrigen.fechaSalida.mes+"/"+vueloAntesOrigen.fechaSalida.anho+"-"+vueloAntesOrigen.fechaSalida.hora);
        }else{
            pw.print("Era primer vuelo");
        }
            
        if (vueloDespuesDestino!=null){
            pw.println("->"+vueloDespuesDestino.destino.pais.nombrePais+"/"+vueloDespuesDestino.fechaLlegada.dia+"/"+vueloDespuesDestino.fechaLlegada.mes+"/"+vueloDespuesDestino.fechaLlegada.anho+"-"+vueloDespuesDestino.fechaLlegada.hora);
        }else{
            pw.println("Era útlimo vuelo");
        }
        pw.println();
        pw.println();
        
        pw.println("Tramo original(Primera fecha >)(Ultima fecha <)");
        pw.println("Origen->Destino(Ciudad/Fecha-Hora)***");
        pw.println("--------------------------------------");
        Vuelo vueloXorigen=tramoX.get(0);
        Vuelo vueloXdestino=tramoX.get(tramoX.size()-1);
        pw.print(vueloXorigen.origen.pais.nombrePais+"/"+vueloXorigen.fechaSalida.dia+"/"+vueloXorigen.fechaSalida.mes+"/"+vueloXorigen.fechaSalida.anho+"-"+vueloXorigen.fechaSalida.hora);
        pw.println("->"+vueloXdestino.destino.pais.nombrePais+"/"+vueloXdestino.fechaLlegada.dia+"/"+vueloXdestino.fechaLlegada.mes+"/"+vueloXdestino.fechaLlegada.anho+"-"+vueloXdestino.fechaLlegada.hora);
        pw.println();
        pw.println();
        
        pw.println("Tramos candidatos(Primera fecha >)(Ultima fecha <)");
        pw.println("Origen->Destino(Ciudad/Fecha-Hora)***");
        pw.println("--------------------------------------");
        ArrayList<Vuelo> tramoYactual;
        for(int i =0;i<tramosY.size();i++){
            pw.print("Tramo("+(i+1)+")");
            tramoYactual = tramosY.get(i);
            Vuelo vueloActualTramoY;
            for (int j =0;j<tramoYactual.size();j++){
                vueloActualTramoY = tramoYactual.get(j);
                pw.print(vueloActualTramoY.origen.pais.nombrePais+"/"+vueloActualTramoY.fechaSalida.dia+"/"+vueloActualTramoY.fechaSalida.mes+"/"+vueloActualTramoY.fechaSalida.anho+"-"+vueloActualTramoY.fechaSalida.hora);
                pw.print("->"+vueloActualTramoY.destino.pais.nombrePais+"/"+vueloActualTramoY.fechaLlegada.dia+"/"+vueloActualTramoY.fechaLlegada.mes+"/"+vueloActualTramoY.fechaLlegada.anho+"-"+vueloActualTramoY.fechaLlegada.hora+"***");
            }
            pw.println();
        }
        pw.close();
    }
}
